        TITL DAI FIRMWARE 1E000-1E22A  V1.0  Rev.1
        ORG   :E000
*
*
*
*   ===================
*** MATH./SOUND PACKAGE ***
*   ===================
*
* The sound package starts at 1EE6E.
*
*   =============
*** MATH. PACKAGE ***
*   =============
*
* Called by RST 4: DATA XX. XX indicates the
* offset from #E000 for the different entrypoints.
*
* The routines jumped to by RST 4: DATA 7B-F3 are
* identical to RST 4; DATA 00-78, but for use with
* the AMD9511A Math.chip.
* Which routines are used, depends on the offset
* in RAM address #00D4.
*
* The accumulator is the MACC (00D5-00D8) or the
* math.chip accu MTOS.
*
************************
* SOFTWARE ENTRYPOINTS *
************************
*
* #00D4 contains offset 00.
*
*SVECA
MFADD   JMP   :EDAA     FPT addition
MFSUB   JMP   :EDB4     FPT subtraction
MFMUL   JMP   :E0FE     FPT multiplication
MFDIV   JMP   :E108     FPT division
MLOAD   JMP   :E112     Copy operand to accu
MSAVE   JMP   :E11C     Copy accu to operand
MPUT    JMP   :E126     Copy reg A,B,C,D to accu
MGET    JMP   :E133     Copy accu to reg A,B,C,D
MFABS   JMP   :E140     FPT ABS
MFCHS   JMP   :E14A     FPT change sign accu
MFINT   JMP   :E443     FPT INT(X)
MFRAC   JMP   :E154     FPT FRAC
MPWR    JMP   :E855     FPT power
MLN     JMP   :E745     LOG
MEXP    JMP   :E667     EXP
MLOG    JMP   :E870     LOGT
MALOG   JMP   :E880     ALOG
MSQRT   JMP   :E5F8     SQR
MSIN    JMP   :E7D2     SIN
MCOS    JMP   :E7D9     COS
MTAN    JMP   :E894     TAN
MASIN   JMP   :E96C     ASIN
MACOS   JMP   :E9C1     ACOS
MATAN   JMP   :E8AC     ATN
MFIX    JMP   :E414     Change accu to INT
MFLT    JMP   :E3DE     Change accu to FPT
MIADD   JMP   :E16D     INT addition
MISUB   JMP   :E18D     INT subtraction
MIMUL   JMP   :E1AC     INT multiplication
MIDIV   JMP   :E22B     INT division
MIREM   JMP   :E238     INT divide remainder
MIABS   JMP   :E30B     INT ABS
MICHS   JMP   :E315     INT change sign accu
MIAND   JMP   :E32E     IAND
MIOR    JMP   :E345     IOR
MIXOR   JMP   :E35C     IXOR
MINOT   JMP   :E373     INOT
MSHL    JMP   :E3A5     SHL
MSHR    JMP   :E398     SHR
MSA00   JMP   :EDC0     Part of SAVEA
L1E274  JMP   :EFA6     Bank return
*
************************
* HARDWARE ENTRYPOINTS *
************************
*
* #00D4 contains offset #7B from #E000 as base
* for HVECA.
*
HVECA   JMP   :E474     FPT addition
        JMP   :E479     FPT subtraction
        JMP   :E47E     FPT multiplication
        JMP   :E483     FPT division
        JMP   :E588     Copy operand to accu
        JMP   :E599     Copy accu to operand
        JMP   :E55F     Copy reg A,B,C,D to accu
        JMP   :E56F     Copy accu to reg A,B,C,D
        JMP   :E488     FPT ABS
        JMP   :E493     FPT change sign accu
        JMP   :E498     FPT INT(X)
        JMP   :E4A0     FPT FRAC
        JMP   :EDA1     FPT power
        JMP   :E4B1     LOG
        JMP   :E4B6     EXP
        JMP   :E4BB     LOGT
        JMP   :E4C0     ALOG
        JMP   :E4CC     SQR
        JMP   :E4D1     SIN
        JMP   :E4D6     COS
        JMP   :E4DB     TAN
        JMP   :E4E0     ASIN
        JMP   :E4E5     ACOS
        JMP   :E4EA     ATN
        JMP   :E4EF     Change accu to INT
        JMP   :E49B     Change accu to FPT
        JMP   :E4F4     INT addition
        JMP   :E4F9     INT subtraction
        JMP   :E4FE     INT multiplication
        JMP   :E503     INT division
        JMP   :E508     INT divide remainder
        JMP   :E517     INT ABS
        JMP   :E522     INT change sign accu
        JMP   :ED19     IAND
        JMP   :ED26     IOR
        JMP   :ED33     IXOR
        JMP   :ED43     INOT
        JMP   :ED6C     SHL
        JMP   :ED55     SHR
        JMP   :EDC0     Part of SAVEA ) Not via
        JMP   :EFA6     Bank return   ) AMD9511
*
        DATA  :FF
        DATA  :FF
        DATA  :FF
        DATA  :FF
        DATA  :FF
        DATA  :FF
        DATA  :FF
        DATA  :FF
*
**********************
* FPT MULTIPLICATION *
**********************
*
* MACC = MACC * MEM.
*
* Entry: HL: Points to multiplier.
* Exit:  All registers preserved.
*
XFMUL   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :EA59     FPT multiplication
        JMP   :C14D     Popall, ret
*
****************
* FPT DIVISION *
****************
*
* MACC = MACC / MEM.
*
* Entry: HL: Points to divisor.
* Exit:  All registers preserved.
*
XFDIV   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :EA20     FPT division
        JMP   :C14D     Popall, ret
*
**************************
* COPY OPERAND INTO MACC *
**************************
*
* Entry: HL: Points to operand.
* Exit:  All registers preserved.
*
XLOAD   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E9FB     Copy operand in MACC
        JMP   :C14D     Popall, ret
*
************************
* COPY MACC TO OPERAND *
************************
*
* Entry: HL: Points to operand.
* Exit:  All registers preserved.
*
XSAVE   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E9D6     Copy MACC to operand
        JMP   :C14D     Popall, ret
*
************************************
* COPY REGISTERS A,B,C,D INTO MACC *
************************************
*
* Entry: None.
* Exit:  All registers preserved.
*
XPUT    PUSH  H
        MOV   H,D       )
        MOV   L,C       ) DC in HL
        SHLD  :00D7     Copy D,C into 00D8/7
        MOV   H,B       )
        MOV   L,A       ) BA in HL
        SHLD  :00D5     Copy B,A into 00D6/5
        POP   H
        RET
*
************************************
* COPY MACC INTO REGISTERS A,B,C,D *
************************************
*
* Entry: None.
* Exit:  EHLF preserved.
*
XGET    PUSH  H
        LHLD  :00D7     Get lobytes MACC
        MOV   C,L       )
        MOV   D,H       ) Into registers C,D
        LHLD  :00D5     Get hibytes MACC
        MOV   A,L       )
        MOV   B,H       ) Into registers A,B
        POP   H
        RET
*
***********
* FPT ABS *
***********
*
* For FPT values: MACC = Absolute value
* of MACC.
*
* Entry: None.
* Exit:  All registers preserved.
*
XFABS   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E9EE     Take abs.value of MACC
        JMP   :C14D     Popall, ret
*
*************************
* FPT: CHANGE SIGN MACC *
*************************
*
* For FPT values: MACC = - MACC
*
* Entry: None.
* Exit:  All registers preserved.
*
XFCHS   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E9E4     Change sign MACC
        JMP   :C14D     Popall, ret
*
************
* FPT FRAC *
************
*
* The FPT number in the MACC is replaced by its
* fractional part.
*
* Entry: None.
* Exit:  All registers preserved.
*
XFRAC   PUSH  PSW
        PUSH  H
        CALL  :C21E     Save MACC on stack
        CALL  :E443     Take INT value of MACC
        LXI   H,:0000
        DAD   SP        Pnts to orig MACC on stack
        CALL  :EDB4     Subtract INT(MACC)-MACC
        CALL  :E14A     Make result positive again
        INX   SP
        INX   SP
        INX   SP
        INX   SP        Correct SP
        POP   H
        POP   PSW
        RET
*
********************
* INTEGER ADDITION *
********************
*
* Signed 32-bit addition: MACC = MACC + MEM.
* Evt. overflow handling via CO4B.
*
* Entry: HL: Points to 1st byte of operand.
* Exit:  All registers preserved.
*
XIADD   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E38C     MACC into reg E,B,C,A
 REM D = compl 00D5 EXOR M
        PUSH  D
        ADD   M         )
        MOV   D,A       )
        DCX   H         )
        MOV   A,C       )
        ADC   M         )   Add contents MEM to EBCA
        MOV   C,A       )   Result in EBCD
        DCX   H         )
        MOV   A,B       )
        ADC   M         )
        MOV   B,A       )
        DCX   H         )
        MOV   A,E       )
        ADC   M         )
        MOV   E,A       )
        RAR             Evt carry in msb
        XRA   E         Msb=1 if overflow
        POP   H         Get compl 00D5 EXOR M
 REM (0 if different signbits)
        ANA   H         Overflow only if different
 REM signbits
L1E11   CM    :C04B     Then run overflow error
        JMP   :E384     Copy E into A; Then reg
 REM ABCD into MACC
*
***********************
* INTEGER SUBTRACTION *
***********************
*
* Signed 32-bit subtraction: MACC = MACC - MEM.
* Evt. overflow handling via CO4B.
*
* Entry: HL: Points to 1st byte of operand.
* Exit:  All registers preserved.
*
XISUB   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        CALL  :E38C     Copy MACC into reg EBCA
 REM D = compl 00D5 EXOR M
        PUSH  D
        SUB   M         )
        MOV   D,A       )
        DCX   H         )
        MOV   A,C       )
        SBB   M         )
        MOV   C,A       ) Subtract EBCA - MEM
        DCX   H         )  Result in EBCD
        MOV   A,B       )
        SBB   M         )
        MOV   B,A       )
        DCX   H         )
        MOV   A,E       )
        SBB   M         )
        MOV   E,A       )
        RAR             Evt carry in msb
        XRA   E         Msb=1 if overflow
        POP   H         Get compl 00D5 EXOR M
        ORA   H
        CMA
        ORA   A         Msb=1 ?
        JMP   :E187     Evt run overflow error;
 REM Copy result into MACC
*
**************************
* INTEGER MULTIPLICATION *
**************************
*
* Signed 32-bit multiplication: MACC = MACC * MEM.
* The overflow exit is taken if both factors are
* more than 2 bytes or the product is longer than
* the signbit of the 4th byte.
* If MEM > 2 bytes, than MACC into DE and MEM into
* MACC, assuming that MACC is max. 2 bytes.
*
* Entry: HL: Points to multiplier.
* Exit:  All registers preserved.
*
XIMUL   PUSH  PSW
        PUSH  B
        PUSH  D
        PUSH  H
        LDA   :00D5     Get sign byte
        ORA   A
        CM    :E315     If nr <0: change sign
        JC    :E225     (Don't work: E315 preserves
 REM flags; ORA A clears CY)
        XRA   M         Final sign bit in S-flag
        PUSH  PSW       Save it
        MOV   A,M       )
        INX   H         )
        ORA   A         ) Get MEM into BCDE
        MOV   B,A       ) Set flags on sign byte
        MOV   C,M       )
        INX   H         )
        MOV   D,M       )
        INX   H         )
        MOV   E,M       )
        CM    :E3C9     If MEM <0: negate BCDE
        JC    :E225     Error exit if overflow
        ORA   C
        JZ    :E1DF     Jump if MEM <= 2 bytes
 REM
* MEM > 2 bytes: exchange MACC with BCDE:
 REM
        LHLD  :00D5     Get hibytes MACC
        MOV   A,H
        ORA   L
        JNZ   :E225     Overflow exit if MACC >
 REM 2 bytes
        LHLD  :00D7     Get lobytes MACC in HL
        CALL  :E3CF     Copy reg BCDE (=MEM) into
 REM MACC
        MOV   D,L       )
        MOV   E,H       ) Orig. MACC into DE
 REM
* Now 4-byte nr in MACC and 2 byte nr in DE:
 REM
L1E14   LXI   H,:0000
        PUSH  H         0000 on stack
        LXI   H,:00D8   Addr lobyte MACC
        MOV   C,M       lobyte in C
L1E15   XTHL            On stack: addr current MACC
 REM byte
        MOV   A,C       Current byte in A
        ORA   A
        JZ    :E21E     Jump if byte=0
        MVI   B,:80
L1E16   MOV   A,C       ) Current MACC byte in A
        RAR             )
        MOV   C,A       )
        JNC   :E1F6     ) SHR reg H,L and B as long
 REM ) no carry from C
        DAD   D         ) Else: Add other nr to HL
L1E17   MOV   A,H       )
        RAR             )
        MOV   H,A       )
        MOV   A,L       )-- Effect: Multiply MACC by
        RAR             )           DE, result in B
        MOV   L,A       )
        MOV   A,B       )
        RAR             )
        MOV   B,A       )
        JNC   :E1EF     ) Do L1E16 max 8 times
        XTHL            HL pnts to current MACC byte
        MOV   M,B       Result in MACC byte
        DCX   H         Pnts to next lower MACC byte
        MOV   A,L       Get lobyte of addr
        CPI   :D4       Ready?
        MOV   C,M       Get next lower byte in C
        JNZ   :E1E7     Not ready: mult. next byte
 REM
* Multiplication done:
 REM
        POP   H
        MOV   A,B       Get last result
        ORA   A
        JM    :E225     Error exit if overflow
        MOV   A,H       )
        ORA   L         ) Check if HL<>0
        JNZ   :E225     Then overflow exit
L1E19   POP   PSW       Get final sign in S-flag
        CM    :E315     Change sign MACC if nr must
 REM be negative
        JMP   :C14D     Popall, ret
 REM
* If MACC byte = 0:
 REM
L1E20   MOV   B,L       ) Move bytes in HLB one byte
        MOV   L,H       ) down
        MVI   H,:00     )
        JMP   :E202     Go to next MACC byte
 REM
* If overflow error:
 REM
L1E21   CALL  :C04B     Run overflow error
        JMP   :E217     Quit
*
*
*
        UNL
SVECA   EQU MFADD
        LST
        END
